package com.ruoyi.system.service.impl;

import cn.hutool.core.bean.BeanUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.exception.GlobalException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.system.domain.dto.XsItemDataDto;
import com.ruoyi.system.domain.xs.XsItemData;
import com.ruoyi.system.mapper.XsDataMapper;
import com.ruoyi.system.service.IXsDataService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

/**
* @author 97099
* @description 针对表【xs_data(写手数据)】的数据库操作Service实现
* @createDate 2025-01-06 18:31:53
*/
@Service
public class XsDataServiceImpl extends ServiceImpl<XsDataMapper, XsItemData>
    implements IXsDataService {

    /**
     * 条件查询数据列表
     * @param itemDataDto
     * @return
     */
    @Override
    public List<XsItemData> selectDataList(XsItemDataDto itemDataDto) {
        LambdaQueryWrapper<XsItemData> lqw = new LambdaQueryWrapper<>();
        lqw.eq(StringUtils.isNotEmpty(itemDataDto.getStatus()), XsItemData::getStatus, itemDataDto.getStatus())
                .eq(StringUtils.isNotEmpty(itemDataDto.getSource()), XsItemData::getSource, itemDataDto.getSource())
                .eq(StringUtils.isNotEmpty(itemDataDto.getJobNumber()), XsItemData::getJobNumber, itemDataDto.getJobNumber());
        if (StringUtils.isNotEmpty(itemDataDto.getStaTime()) && StringUtils.isNotEmpty(itemDataDto.getEndTime())) {
            lqw.between(XsItemData::getEndTime, itemDataDto.getStaTime(), itemDataDto.getEndTime());
        }
        return list(lqw);
    }

    @Override
    public boolean add(XsItemDataDto itemDataDto) {
        return false;
    }

    /**
     * 批量导入写手数据
     * @param file
     */
    @Override
    @Transactional
    public void batchImportDataClue(MultipartFile file) {
        ExcelUtil<XsItemDataDto> util = new ExcelUtil<XsItemDataDto>(XsItemDataDto.class);
        try {
            // 文档数据
            List<XsItemDataDto> dataDtoLists = util.importExcel(file.getInputStream());
            int count = 2;

            List<XsItemData> excel = new ArrayList<>();
            // 表存在数据
            List<XsItemData> exist = new ArrayList<>();
            // 表不存在数据
            List<XsItemData> nonentity = new ArrayList<>();
            // 查询全部订单
            List<XsItemData> xsDataList = lambdaQuery().list();

            if (StringUtils.isNotEmpty(dataDtoLists)) {
                for (XsItemDataDto xsDataDto : dataDtoLists) {
                    XsItemData xsData = new XsItemData();
                    // 需要校验订单来源,工号,接单日期是否存在
                    if (StringUtils.isBlank(xsDataDto.getSource()) ||
                            StringUtils.isBlank(xsDataDto.getJobNumber()) ||
                            StringUtils.isBlank(xsDataDto.getPayTime())) {
                        throw new GlobalException("第" + count + "条客服订单来源,工号,接单日期等不能为空");
                    }
                    BeanUtil.copyProperties(xsDataDto, xsData);

                    if (StringUtils.isNotEmpty(xsDataList)) {
                        List<String> dataIdList = xsDataList.stream().map(XsItemData::getOrderId).distinct().collect(Collectors.toList());
                        if (dataIdList.contains(xsData.getOrderId())) {
                            List<XsItemData> oList = xsDataList.stream().filter(o -> !o.getOrderId().equals(xsDataDto.getOrderId())).collect(Collectors.toList());
                            xsData.setId(oList.get(0).getId());
                            xsData.setUpdateBy(SecurityUtils.getUsername());
                            xsData.setUpdateTime(DateUtils.getNowDate());
                            exist.add(xsData);
                        }else {
                            xsData.setCreateBy(SecurityUtils.getUsername());
                            xsData.setCreateTime(DateUtils.getNowDate());
                            xsData.setUpdateBy(SecurityUtils.getUsername());
                            xsData.setUpdateTime(DateUtils.getNowDate());
                            nonentity.add(xsData);
                        }
                    } else {
                        xsData.setCreateBy(SecurityUtils.getUsername());
                        xsData.setCreateTime(DateUtils.getNowDate());
                        xsData.setUpdateBy(SecurityUtils.getUsername());
                        xsData.setUpdateTime(DateUtils.getNowDate());
                        nonentity.add(xsData);
                    }

                    count++;
                }
            }else {
                throw new GlobalException("导入失败！excel内数据为空");
            }

            if (!this.updateData(exist)){
                throw new GlobalException("导入失败！更新数据异常");
            }

            if (StringUtils.isNotEmpty(nonentity)) {
                this.saveBatch(nonentity);
            }
        } catch (IOException e) {
            e.printStackTrace();
            throw new RuntimeException("导入失败");
        }
    }

    @Transactional
    public boolean updateData(List<XsItemData> updateList) {
        if (StringUtils.isEmpty(updateList)) {
            return true;
        }
        return this.saveOrUpdateBatch(updateList);
    }
}




